package xml;

import static org.junit.Assert.assertTrue;
import graphviz.MetaModel.ElementDot;
import graphviz.MetaModel.LiaisonDot;
import graphviz.MetaModel.LigneElementDot;
import graphviz.MetaModel.enumeration.TypeElementDot;
import graphviz.MetaModel.enumeration.TypeLiaisonDot;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import languageObject.metatModel.ElementObject;
import languageObject.metatModel.LiaisonElement;
import languageObject.metatModel.SousElementObject;
import languageObject.metatModel.enumeration.TypeElementObject;

import org.junit.Test;

import partager.TypeSousElement;
import partager.TypeSousElementVar;
import uspeedd.metamodel.enumeration.TypeAssociationUspeed;
import xml.parseur.XmlGraphviz;
import xml.parseur.XmlObject;
import constantes.ConstanteLien;

public class TestLectureXml 
{
	private List<ElementObject> genObject()
	{
		List<ElementObject> list = new ArrayList<ElementObject>();
		
		ElementObject elementContact = new ElementObject();
		elementContact.setNom("Contact");									//le nom de la classe
		elementContact.setType(TypeElementObject.CLASS);					// le type de la classe
		SousElementObject sousElementContact = new SousElementObject();
		sousElementContact.setType(TypeSousElement.ATTRIBUT);				//attribut
		sousElementContact.setNom("nom");
		sousElementContact.setTypeOutput(new TypeSousElementVar(false, "String"));
		elementContact.addSousElement(sousElementContact);
		sousElementContact = new SousElementObject();								//attribut
		sousElementContact.setType(TypeSousElement.ATTRIBUT);
		sousElementContact.setNom("prenom");
		sousElementContact.setTypeOutput(new TypeSousElementVar(false, "String"));
		elementContact.addSousElement(sousElementContact);
		sousElementContact = new SousElementObject();								//attribut
		sousElementContact.setType(TypeSousElement.ATTRIBUT);
		sousElementContact.setNom("tel");
		sousElementContact.setTypeOutput(new TypeSousElementVar(false, "String"));
		elementContact.addSousElement(sousElementContact);
		sousElementContact = new SousElementObject();								//Methode
		sousElementContact.setType(TypeSousElement.METHODE);
		sousElementContact.setNom("appel");
		sousElementContact.setTypeOutput(new TypeSousElementVar(false, "Boolean"));
		elementContact.addSousElement(sousElementContact);
		sousElementContact = new SousElementObject();								//Methode
		sousElementContact.setType(TypeSousElement.METHODE);
		sousElementContact.setNom("estDeLaMemeFamille");
		sousElementContact.setTypeOutput(new TypeSousElementVar(false, "Boolean"));
		sousElementContact.addTypeInput(new SousElementObject(TypeSousElement.ATTRIBUT, "contact", new TypeSousElementVar(false, "Contact"), null));
		elementContact.addSousElement(sousElementContact);
				
		elementContact.setNote("ceci est la classe contact");
		
		ElementObject elementIC = new ElementObject();
		elementIC.setNom("IContact");									//le nom de la classe
		elementIC.setType(TypeElementObject.INTERFACE);					// le type de la classe
		SousElementObject sousElementIC = new SousElementObject(); //Methode							
		sousElementIC.setType(TypeSousElement.METHODE);
		sousElementIC.setNom("get");
		sousElementIC.setTypeOutput(new TypeSousElementVar(false, "Contact"));
		elementIC.addSousElement(sousElementIC);
		elementIC.setNote("ceci est l'interface");
				
		ElementObject elementAnnuaire = new ElementObject();
		elementAnnuaire.setNom("Annuaire");									//le nom de la classe
		elementAnnuaire.setType(TypeElementObject.CLASS);					// le type de la classe
		SousElementObject sousElementAnnuaire = new SousElementObject();
		sousElementAnnuaire.setType(TypeSousElement.ATTRIBUT);				//attribut
		sousElementAnnuaire.setNom("list");
		sousElementAnnuaire.setTypeOutput(new TypeSousElementVar(true, "IContact"));
		elementAnnuaire.addSousElement(sousElementAnnuaire);
		sousElementAnnuaire = new SousElementObject();								//Methode
		sousElementAnnuaire.setType(TypeSousElement.METHODE);
		sousElementAnnuaire.setNom("add");
		sousElementAnnuaire.addTypeInput(new SousElementObject(TypeSousElement.ATTRIBUT, "nom", new TypeSousElementVar(false, "IContact"), null));
		elementAnnuaire.addSousElement(sousElementAnnuaire);
		elementAnnuaire.setNote("ceci est la liste");
			
		list.add(elementContact);
		
		LiaisonElement liasionAnnuaire = new LiaisonElement();
		liasionAnnuaire.setType(TypeAssociationUspeed.ASSOCIATION);
		liasionAnnuaire.setElement(elementAnnuaire);
		liasionAnnuaire.setCardinality("1 to *");
		elementAnnuaire.addLiaison(liasionAnnuaire);
		list.add(elementIC);
		
		LiaisonElement liasionIC = new LiaisonElement();
		liasionIC.setType(TypeAssociationUspeed.IMPLEMENT);
		liasionIC.setElement(elementIC);
		liasionIC.setCardinality("1 to *");
		elementContact.addLiaison(liasionIC);
		list.add(elementIC);
										
		return list;
	}
	
	private List<ElementDot> genDot()
	{
		List<ElementDot> list = new ArrayList<ElementDot>();
		
		ElementDot elementContact = new ElementDot();
		elementContact.setTitre("Contact");									//le nom de la classe
		elementContact.setType(TypeElementDot.CLASS);					// le type de la classe
		LigneElementDot sousElementContact = new LigneElementDot();
		sousElementContact.setType(TypeSousElement.ATTRIBUT);				//attribut
		sousElementContact.setNom("nom");
		sousElementContact.setOutput(new TypeSousElementVar(false, "String"));
		elementContact.add(sousElementContact);
		sousElementContact = new LigneElementDot();								//attribut
		sousElementContact.setType(TypeSousElement.ATTRIBUT);
		sousElementContact.setNom("prenom");
		sousElementContact.setOutput(new TypeSousElementVar(false, "String"));
		elementContact.add(sousElementContact);
		sousElementContact = new LigneElementDot();								//attribut
		sousElementContact.setType(TypeSousElement.ATTRIBUT);
		sousElementContact.setNom("tel");
		sousElementContact.setOutput(new TypeSousElementVar(false, "String"));
		elementContact.add(sousElementContact);
		sousElementContact = new LigneElementDot();								//Methode
		sousElementContact.setType(TypeSousElement.METHODE);
		sousElementContact.setNom("appel");
		sousElementContact.setOutput(new TypeSousElementVar(false, "Boolean"));
		elementContact.add(sousElementContact);
		sousElementContact = new LigneElementDot();								//Methode
		sousElementContact.setType(TypeSousElement.METHODE);
		sousElementContact.setNom("estDeLaMemeFamille");
		sousElementContact.setOutput(new TypeSousElementVar(false, "Boolean"));
		sousElementContact.add(new TypeSousElementVar(false, "Contact"));
		elementContact.add(sousElementContact);
				
		elementContact.setNote("ceci est la classe contact");
		
		ElementDot elementIC = new ElementDot();
		elementIC.setTitre("IContact");									//le nom de la classe
		elementIC.setType(TypeElementDot.INTERFACE);					// le type de la classe
		LigneElementDot sousElementIC = new LigneElementDot(); //Methode							
		sousElementIC.setType(TypeSousElement.METHODE);
		sousElementIC.setNom("get");
		sousElementIC.setOutput(new TypeSousElementVar(false, "Contact"));
		elementIC.add(sousElementIC);
		elementIC.setNote("ceci est l'interface");
				
		ElementDot elementAnnuaire = new ElementDot();
		elementAnnuaire.setTitre("Annuaire");									//le nom de la classe
		elementAnnuaire.setType(TypeElementDot.CLASS);					// le type de la classe
		LigneElementDot sousElementAnnuaire = new LigneElementDot();
		sousElementAnnuaire.setType(TypeSousElement.ATTRIBUT);				//attribut
		sousElementAnnuaire.setNom("list");
		sousElementAnnuaire.setOutput(new TypeSousElementVar(true, "IContact"));
		elementAnnuaire.add(sousElementAnnuaire);
		sousElementAnnuaire = new LigneElementDot();								//Methode
		sousElementAnnuaire.setType(TypeSousElement.METHODE);
		sousElementAnnuaire.setNom("add");
		sousElementAnnuaire.add(new TypeSousElementVar(false, "IContact"));
		elementAnnuaire.add(sousElementAnnuaire);
		elementAnnuaire.setNote("ceci est la liste");
			
		list.add(elementContact);
		
		LiaisonDot liasionAnnuaire = new LiaisonDot();
		liasionAnnuaire.add(TypeLiaisonDot.TRAI_FLECHE);
		liasionAnnuaire.setPere(elementAnnuaire);
		liasionAnnuaire.setValLiaison("1 to *");
		elementAnnuaire.add(liasionAnnuaire);
		list.add(elementIC);
		
		LiaisonDot liasionIC = new LiaisonDot();
		liasionIC.add(TypeLiaisonDot.TRAI_FLECHE);
		liasionIC.setPere(elementIC);
		liasionIC.setValLiaison("1 to *");
		elementContact.add(liasionIC);
		list.add(elementIC);
										
		return list;
	}
	
	
	@Test
	public void testLectureObject() 
	{
		XmlObject xml = new XmlObject(new File(ConstanteLien.ENTREE_XML));
		List<ElementObject> list = xml.lecture();
		
		assertTrue(list != null);
		
		List<ElementObject> gen = genObject();
		//assertTrue(Utils.equalsList(list, gen));
	}
	
	@Test
	public void testLectureDot() 
	{
		XmlGraphviz xml = new XmlGraphviz(new File(ConstanteLien.ENTREE_XML));
		List<ElementDot> list = xml.lecture();
		
		assertTrue(list != null);
		
		List<ElementDot> gen = genDot();
		//assertTrue(Utils.equalsList(list, genDOT()));
	}
}